home *** CD-ROM | disk | FTP | other *** search
/ Complete Linux / Complete Linux.iso / docs / apps / database / ingres04.lzh / source / decomp / tempvar.c < prev    next >
Encoding:
C/C++ Source or Header  |  1985-01-23  |  3.8 KB  |  163 lines

  1. # include    <ingres.h>
  2. # include    <tree.h>
  3. # include    <symbol.h>
  4. # include    <sccs.h>
  5.  
  6. SCCSID(@(#)tempvar.c    8.1    12/31/84)
  7.  
  8.  
  9. /*
  10. ** TEMPVAR
  11. **
  12. **    This file contains routines associated with redefining
  13. **    attribute numbers. This is needed when one variable sub queries
  14. **    or reduction change the positions of attributes in a relation.
  15. **    This file includes:
  16. **
  17. **    Tempvar -- Change the attribute numbers to new ones.
  18. **
  19. **    Origvar -- Restore attribute numbers back to their previous values.
  20. **
  21. **    Ckvar   -- Return the currently active VAR node
  22. **
  23. **    Trace Flags:
  24. **        51
  25. */
  26. /*
  27. ** Tempvar -- Replace a VAR attribute number with its new number.
  28. **
  29. **    Tempvar is given a list of subqueries which will potentially
  30. **    alter the attribute numbers of VARs they reference. An attno
  31. **    is changed by making the current VAR point to a new VAR node
  32. **    which has the updated attno.
  33. **
  34. **    The new attno is determined from the target list of the subquery
  35. **    for that VAR. The RESDOM number is the new attno and the VAR it
  36. **    points to is the old attno. For example:
  37. **        RESDOM/2 -> right = VAR 1/3
  38. **    The right subtree of result domain 2 is domain 3 of variable 1.
  39. **    Thus domain 3 should be renumbered to be domain 2.
  40. */
  41.  
  42. tempvar(node, sqlist, buf)
  43. register QTREE    *node;
  44. QTREE        *sqlist[];
  45. char        *buf;
  46. {
  47.     register QTREE    *v, *sq;
  48.     QTREE        *ckvar();
  49.     extern char    *need(), *rangename();
  50.  
  51.  
  52.     if (node == NULL)
  53.         return;
  54.  
  55.     if (node->sym.type == VAR )
  56.     {
  57.         node = ckvar(node);
  58.         if (sq = sqlist[node->sym.value.sym_var.varno])
  59.         {
  60.             /* This var has a subquery on it */
  61.  
  62.             /* allocate a new VAR node */
  63.             if (buf)
  64.             {
  65.                 node->sym.value.sym_var.valptr = (ANYTYPE *) need(buf, QT_HDR_SIZ + sizeof(struct varnode));
  66.                 v = (QTREE *) node->sym.value.sym_var.valptr;
  67.                 bmove(&node->sym, &v->sym, SYM_HDR_SIZ + sizeof(struct varnode) - sizeof v);
  68.                 v->left = v->right = NULL;
  69.                 v->sym.value.sym_var.valptr = NULL;
  70.                 node->sym.value.sym_var.varno = -1;
  71.             }
  72.             else
  73.                 v = node;
  74.  
  75.             /* search for the new attno */
  76.             for (sq = sq->left; sq->sym.type != TREE; sq = sq->left)
  77.             {
  78.                 if (ckvar(sq->right)->sym.value.sym_var.attno == node->sym.value.sym_var.attno) 
  79.                 {
  80.     
  81.                     v->sym.value.sym_var.attno = sq->sym.value.sym_resdom.resno;
  82. #                    ifdef xDTR1
  83.                     if (tTf(51, 3))
  84.                     {
  85.                         printf("Tempvar:");
  86.                         nodepr(node);
  87.                     }
  88. #                    endif
  89.  
  90.                     return;
  91.                 }
  92.             }
  93.             syserr("tempvar:dom %d of %s missing", node->sym.value.sym_var.attno, rangename(node->sym.value.sym_var.varno));
  94.         }
  95.         return;
  96.     }
  97.  
  98.     tempvar(node->left, sqlist, buf);
  99.     tempvar(node->right, sqlist, buf);
  100. }
  101. /*
  102. ** Origvar -- Restore VAR node to previous state.
  103. **
  104. **    Origvar undoes the effect of tempvar. All vars listed
  105. **    in the sqlist will have their most recent tempvar removed.
  106. */
  107.  
  108. origvar(t, sqlist)
  109. register QTREE    *t;
  110. QTREE        *sqlist[];
  111. {
  112.     register char    v;
  113.     register QTREE    *q;
  114.  
  115.     if (t == NULL)
  116.         return;
  117.     if (t->sym.type == VAR && t->sym.value.sym_var.varno < 0)
  118.     {
  119.         while ((v = (q = (QTREE *) (t->sym.value.sym_var.valptr))->sym.value.sym_var.varno) < 0)
  120.             t = q;
  121.  
  122.         if (sqlist[v])
  123.         {
  124.             t->sym.value.sym_var.varno = v;
  125.             t->sym.value.sym_var.valptr = NULL;
  126.         }
  127.         return;
  128.     }
  129.     origvar(t->left, sqlist);
  130.     origvar(t->right, sqlist);
  131. }
  132. /*
  133. ** Ckvar -- Return pointer to currently "active" VAR.
  134. **
  135. **    This routine guarantees that "t" will point to
  136. **    the most current definition of the VAR.
  137. */
  138.  
  139. QTREE *
  140. ckvar(t)
  141. register QTREE    *t;
  142. {
  143.     if (t->sym.type != VAR)
  144.     {
  145.         syserr("ckvar: not a VAR %d", t->sym.type);
  146.     }
  147. #    ifdef xDTR1
  148.     if (tTf(51, 2))
  149.     {
  150.         printf("ckvar: var %d.%d, type ",
  151.                 t->sym.value.sym_var.varno, t->sym.value.sym_var.attno);
  152.         xputchar(t->sym.value.sym_var.varfrmt);
  153.         printf("%3d\n", t->sym.value.sym_var.varfrml);
  154.     }
  155. #    endif
  156.     while (t != NULL && t->sym.value.sym_var.varno < 0)
  157.         t = (QTREE *) t->sym.value.sym_var.valptr;
  158.  
  159.     if (t == NULL)
  160.         syserr("ckvar null valptr");
  161.     return (t);
  162. }
  163.